package org.tri.entity;

import java.util.ArrayList;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import org.hibernate.annotations.Cascade;

/**
 * La clase {@code VentaHistorica}
 * @author kiira
 * @version 1.0, Nov 23, 2011
 */
@Entity
@Table ( name = "venta_hist" )
public class VentaHistorica extends AbstractVenta {

    /** Lista de animales correspondientes a la venta. */
    private List<AnimalHistorico> animalesHistoricos = new ArrayList<AnimalHistorico>();

    /**
     * Nos permite obtener una lista con los animales asociadas a la venta.
     * @return List<Animal> lista de animales
     */
    @OneToMany ( cascade = { CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH },
                 mappedBy = "venta" )
    @Cascade ( { org.hibernate.annotations.CascadeType.SAVE_UPDATE,
                 org.hibernate.annotations.CascadeType.EVICT } )
    public List<AnimalHistorico> getAnimalesHistoricos() {
        return animalesHistoricos;

    }//end método getAnimalesHistoricos

    /**
     * Nos permite cambiar una lista de animales históricos asociados 
     * a la venta por otra lista de animales.
     * Este método es utilizado exclusivamente por Hibernate para asignar
     * los datos de los animales obtenidos de la base de datos.
     * @param animales List<AniamalHistorico> lista de animales
     */
    protected void setAnimalesHistoricos( List<AnimalHistorico> animales ) {
        this.animalesHistoricos = animales;

    }//end método setAnimalesHistoricos   

    /**
     * {@inheritDoc} 
     */
    @Override
    public List<AbstractAnimal> obtenerAnimales() {
        List<AbstractAnimal> anim = new ArrayList<AbstractAnimal>();

        anim.addAll( getAnimalesHistoricos() );
        
        return anim;

    } //end método obtenerAnimales

    /**
     * {@inheritDoc}
     */
    @Override
    public void agregarAnimal(Animal animal) {
        throw new IllegalStateException("No se puede asociar un animal a una"
                                        + " venta historica");
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void agregarAnimales(List<Animal> animales) {
        throw new IllegalStateException("No se puede asociar animales a una"
                                        + " venta historica");
    }

    @Override
    public void eliminarAnimal(Animal animal) {
        throw new IllegalStateException("No se puede desligar animales de una"
                                        + " venta historica");
    }

    @Override
    public void eliminarAnimales(List<Animal> animales) {
        throw new IllegalStateException("No se puede desligar animales de una"
                                        + " venta historica");
    }

}//end clase VentaHistorica

